Wikipédia:Pywikibot/replace.py
Ez a közösségi lap tartalmában elavult, korszerűtlen, frissítésre szorul. |
|
A replace.py használatával kapcsolatban további segítséget kaphatsz a botgazdák üzenőfalán. |
Ezen az oldalon egy technikai leírást olvashatsz a Wikipédia szerkesztéséről. Tartsd szem előtt, hogy nem minden ajánlott, ami technikailag megvalósítható! |
A replace.py a Pywikibot szkriptgyűjtemény egyik modulja.
Ez a program szövegcserét végez. A módosítandó lapok listáját vagy egy xml-állomány (jellemzően a dump) vagy egy szöveges fájl (.txt) vagy egy wikioldal (pl. szerkesztői allap) tartalmazza, de végezhető egyetlen lapon is módosítás. További információ érhető el a help
paraméter segítségével:
python replace.py -help
(Windowsban a python
elhagyható.)
Áttekintés[szerkesztés]
A programot alapvetően kétféleképpen használhatjuk:
- Minden paramétert a parancssorban adunk meg, beleértve a cserélendő szövegeket is. Ez egyszerűbb esetben ajánlott. Pl. a
replace.py -ns:0 egyenlőre egyelőre -search:egyenlőre
parancs a szócikknévtérben (ns:0, ld. Wikipédia:Névtér) az „egyenlőre” szóra végzett keresés alapján (ez ugyanaz, mintha a keresőbe írnánk be a szót) javítja a kis e-vel kezdődő egyenlőre szavakat, mindegyik csere előtt rákérdez (figyeljünk oda, mert van, ahol tényleg az n-es változatot kell meghagyni!), és az alapértelmezett szerkesztési összefoglalót írja a javításhoz. (Ez a parancs szinte legegyszerűbb használható alakja, lásd ennek a szakasznak a végén a minimális paraméterkészletet.)- Ha a cserélendő vagy az új szöveg szóközt tartalmaz, használj idézőjelet!
- A gyakran használt parancsokat Windowsban kötegelt állományban (batch file), Linuxban shell scriptben tárolhatjuk.
- A főbb paramétereket, mindenekelőtt a cserélendő és az új szöveget és a kivételeket, valamint a szerkesztési összefoglalót egy állományban tároljuk. Ez lehet a fixes.py, amely már rendelkezésünkre áll, és minta szerint folytathatjuk; a mentésről viszont fontos gondoskodni, mert a következő frissítéskor felülíródik a „gyárival”! Vagy lehet a user-fixes.py, amit pont erre terveztek, és a benne levő minta alapján tölthető ki. Ez a file nem része a Pywikipedia-disztribúciónak, hanem a generate_user_files.py script futtatásával hozható létre. Ezek az állományok számos ún. fixet tartalmazhatnak; egy fix egy cserélési feladatot ír le, és ha egyszer már megírtad, bármikor újra futtatható. Néhány fixre (a fixes.py szintaxisa szerinti stílusban) a Szerkesztő:BinBot/munka/helyes lap alján linkelt allapokon láthatunk példát. Ha használjuk a fixes.py-t, akkor is megadhatunk néhány további paramétert a parancssorban, másokat viszont a fixben tárolt érték felülírhat, hiába írjuk a parancssorba. Ez a második módszer általában véve sokkal hatékonyabb, ütőképesebb és rugalmasabb, bár több előkészületet igényel.
Más szempontból is kétféle stratégiát követhetünk, az előző választástól függetlenül:
- Egyszerű szövegcserét végezhetünk reguláris kifejezések nélkül is, ami konkrét szavak, sablon- és kategórianevek, fejezetcímek, angolosan átírt orosz focisták stb. esetén jó, de már a ragozott alakokat nem találja meg! Például az egyenlőre helyett egyelőre így is menni fog, de már a kis- és nagybetűs alakot nem tudjuk együtt kezelni. (Megadhatjuk egymás után mind a kettőt a parancssorban, mert lehet több régi→új pár is.)
- Reguláris kifejezéseket használunk, amelyek bizonyos mintákat keresnek, és más mintával helyettesítik. Ez már akkor is szükséges lehet, ha egy szó ragozott alakban is előfordulhat.
A követendő stratégiát egy harmadik szempontból is megválaszthatjuk:
- A javítandó lapokat az élő wikiben keressük (ez keresés, sablon vagy kategória szerinti munka esetén elfogadható sebességet ad, a lapokon való egyszerű végighaladáskor csak nagyon ritka esetben).
- A javítandó lapokat a dumpból vesszük – ekkor nem fogjuk megtalálni azokat a cikkeket, ahova a legutóbbi dump elkészítése óta került bele a cserélendő szöveg, de minta szerinti keresésnél általában sokkal nagyobb sebességet érünk el, és hatékonyabban használhatjuk a gépünk, a szerver és saját magunk idejét is. Bánatunkra ezt kell tennünk akkor is, ha a cserélendő szó különböző ragozott alakokban is előfordulhat, mivel a kereső nem kezeli a reguláris kifejezéseket.
- A legfrissebb dump itt található: http://dumps.wikimedia.org/huwiki/.
- Ha rendszeresen végzel botmunkát, érdemes figyelőlistára venned A dump dátuma sablont, így hamarabb értesülhetsz a frissítésekről.
A negyedik döntésünk így szól:
- Keressük a javítandó cikkeket, és röptében javítjuk is. (Ez általában a -search paraméter használatakor vagy a kategória, ill. sablon szerinti munkáknál ad elfogadható sebességet.)
- Automatikus üzemmódban (a
-save
vagy a-savenew
paraméterrel) kigyűjtjük a potenciálisan javítandó cikkek címét egy állományba, mialatt mi ebédelünk, alszunk, kirándulunk, járőrözünk vagy szócikket írunk (vigyázat, extrém esetben több ebéd is beleférhet!), és a második menetben javítunk, sokkal kisebb holtidővel.
- A minimálisan megadandó paraméterek
Minden futáskor minimálisan a következő paramétereket kell megadnunk:
- Honnan vegye a javítandó lapokat?
- Ez lehet pl. a -start, -file, -page, -search, -xml, -cat valamelyike. (Lásd a lenti táblázat Források szakaszát.)
- Mit cseréljen és mire?
- Ez egy vagy több stringpár lehet, vagy pedig a fix neve, ahol a cserét részletesen leírtuk.
- Bár nem kötelező, de általában érdemes és kezdőknek különösen ajánlott a leszűkítés a szócikknévtérre a -ns:0 paraméterrel (így kerülhető el, hogy pl. a vitalapokon a szerkesztők aláírt hozzászólásait is átjavítsuk). Az olvasók számára látható felület még a sablonok megjelenő része (nem a kód!!!) és a filenévtérben a leírások. Az első időkben kerüld el a szerkesztői lapok, vitalapok és a Wikipédia-névtér szerkesztését, és később is csak különös figyelemmel és a közösség véleményének ismeretében tegyél ilyent. Ne lepődj meg, ha a névteret leíró paraméter elhagyása dühös reakciókat vagy a botod blokkolását váltja ki.
Fájlok[szerkesztés]
A bot – a keretrendszeren felül – 3 fájlt használ:
- replace.py
- a főmodul,
- fixes.py
- néhány előredefiniált javítást tartalmaz,
- user-fixes.py
- saját javításokat tartalmazó fájl; a csaknem üres fájlt a generate_user_files.py hozza létre.
A be-, illetve kimenethez szükséges további fájlok:
- filename.txt
- a cikkek felsorolását tartalmazó fájl neve (a
-file
argumentummal használható), - filename.xml
- helyi xml-állomány (az
-xml
argumentummal használható), - replacelog
- napló, (a
-log
paraméterrel használható).
Argumentumok[szerkesztés]
Lokális argumentumok[szerkesztés]
A replace.py
az alábbi paraméterekkel rendelkezik:
(Például: python replace.py -file:cikkek_listája.txt "sajtóhuba" "sajtóhiba"
)
Források | |
---|---|
-xml | Az xml-állományban megadott lapokkal dolgozik. (pages_current, lásd http://download.wikimedia.org). Az argumentum a -xml:fájl_neve formában is használható.
|
-xmlstart | Az -xml paraméterrel együtt használva megadja annak a cikknek a címét, ahol a keresés kezdődik. A dump általában az első szerkesztés sorrendjében tartalmazza a cikkeket. Ctrl C-vel való megszakításkor a bot kiírja, melyik cikktől folytathatjuk a keresést. |
-file | A txt-fájlban megadott lapokkal dolgozik. Az argumentum a -file:fájl_neve formában is használható.
|
-cat | A megadott kategóriában szereplő lapokkal dolgozik. Az argumentum a -cat:kategória_neve formában is használható.
|
-subcat | Működése a fentihez hasonló, de a megadott kategórián belül az egyes alkategóriákban szereplő lapokkal is dolgozik. |
-transcludes | A megadott sablont használó lapokon dolgozik. Az argumentum a "-transcludes:sablon " formában is használható, például a "-transcludes:csonk " a csonkjelzéssel ellátott lapokat jelöli.
|
-page | Csak a megadott lapon végez szerkesztést. Az argumentum a -page:lap_neve formában is használható. Több oldal megadása esetén az argumentumot többször is fel lehet használni.
|
-ref | A megadott lapra hivatkozó lapokkal dolgozik. Az argumentum a "-ref:hivatkozott_lap_neve " formában is használható.
|
-filelinks | A megadott képre hivatkozó lapokkal dolgozik. Az argumentum a "-filelinks:kép_neve " formában is használható.
|
-links | A megadott wikilapon linkelt lapokon dolgozik. Az argumentum a "-links:linkingpagetitle " formában is használható.
|
-start | A megadott laptól kezdve a wiki összes lapján dolgozik. A "-start:! " megadása esetén a legelejétől kezdi. Megjegyzés: Használd inkább a -xml paramétert; ez a lehetőség akkor jó, ha nincs friss dump.
|
-prefixindex | A megadott előtaggal kezdődő című lapokon dolgozik. (Megfelel a Speciális:Keresés előtag szerint listának.) |
-titleregex | Reguláris kifejezés alapján keresi a módosítandó cikkek címét (pl. -titleregex:'A.* izotópjai'). |
Cél | |
-save | Ezzel a paraméterrel a bot a wikin végzett éles szerkesztés helyett egy állományba gyűjti a javítandó cikkek címét. A munkát így két részre lehet bontani: először automatikus futással kigyűjtjük a dumpból az érintett cikkek címét, miközben nem kell a gép mellett ülni (a -always kapcsolóval vagy az első találatnál az a megadásával), majd később a -file paraméterrel újra futtatva gyorsabban végezhetjük el a javításokat. A file tartalmát beilleszthetjük a wikink egy lapjára is, ilyenkor számozott listaként jelenik meg, és a -links paraméterrel dolgozhatjuk fel. Minden századik cím után egy számozott megjegyzést helyez el, hogy könnyebb legyen több részletben végezni a javítást, ha több ezer cikk szerepel a listán. Ha a megadott állomány már létezik, a bot bővíti. A paraméter -save:fileneve alakban is megadható. |
-savenew | Ugyanúgy működik, mint a -save, csak ha már létezik a megadott állomány, akkor felülírja. A paraméter -savenew:fileneve alakban is megadható. |
A helyettesítéssel kapcsolatos paraméterek | |
-excepttitle:XYZ | Az XYZ szöveget tartalmazó című cikkek átugrása. Amennyiben a -regex argumentumot megadjuk, az XYZ-t mint reguláris kifejezést fogja figyelembe venni. (Példa: az -ít végű igék javításakor kihagyhatjuk azokat a cikkeket, amelyeknek a címében szerepel „a jogalkotásban” szöveg – sok hamis találattól kímélhetjük meg magunkat a régies, 19. századi helyesírású törvénycímek kizárásával.)
|
-excepttext:XYZ | Az XYZ szöveget tartalmazó cikkek átugrása. Amennyiben a -regex argumentumot megadjuk, az XYZ-t mint reguláris kifejezést fogja figyelembe venni.
|
-exceptinside:XYZ | A helyettesítendő szöveg figyelmen kívül hagyása az XYZ szövegen belül. Amennyiben a -regex argumentumot megadjuk, az XYZ-t mint reguláris kifejezést fogja figyelembe venni.
|
-exceptinsidetag:XYZ | A helyettesítendő szöveg figyelmen kívül hagyása az XYZ tagen belül. |
-summary:XYZ | Megadható az összefoglaló szövege. Felülírja az alapértelmezett értéket („Robot: Automatikus szövegcsere …”). |
-fix:XYZ | Előre definiált szövegcserék végrehajtása. A cseréket a fixes.py vagy a user-fixes.py állományban adhatjuk meg a 'fixes' szótár elemeként. A parancssorban megadott cseréket, a -summary, -regex és a kivételekkel kapcsolatos opciókat a bot figyelmen kívül hagyja, és magából a fixből veszi.
A letöltött változatban készen használható fixek:
További fixekre láthatsz példákat a Szerkesztő:BinBot/munka/helyes lapon. |
-namespace:n
rövidítés: -ns:n |
A feldolgozandó névtér sorszáma. Ezt a paramétert többször is használhatod. Az összes többi paraméterrel együttműködik, kivéve a -start paramétert. (Ha egy adott névtérben akarsz dolgozni megadott címtől kezdve, akkor írd ki a névteret, pl. -start:User:! .)
|
névtelen | Az első névtelen argumentum a régi szöveg, míg a második az új szöveg. Amennyiben a -regex argumentumot megadjuk, az első névtelen argumentumban megadott szöveget mint reguláris kifejezést fogja figyelembe venni, a második névtelen argumentum pedig tartalmazhat \\1 vagy \g<name> alakú kifejezéseket. Több ilyen párt is megadhatunk. Az összes elgépelt, fel nem ismert paramétert is cserélendő szövegként próbálja értelmezni a bot. Ha ezek száma páratlan, akkor a pywikibot.exceptions.Error: require even number of replacements. hibaüzenetet kapjuk.
|
Opciók | |
-always | Nem kér megerősítést a cserékhez, automatikusan fut. Veszélyes paraméter, csak akkor használd, ha teljesen biztos vagy benne, hogy jól működik! A -save/-savenew paraméterrel azonban veszélytelenül használható, mivel a bot ilyenkor nem végez szerkesztést a wikin. |
-recursive | Rekurzív cserét végez. |
-nocase | A reguláris kifejezésekben nem tesz különbséget kis- és nagybetű között. |
-allowoverlap | Ha a minta előfordulásai átfedik egymást, mindet cseréli. Fontos! Ne használd, ha nem vagy biztos abban, hogy mit csinálsz, mert ez könnyen végtelen ciklushoz vezethet. |
-regex | A szövegrészeket reguláris kifejezésként fogja kezelni. Ha ez az argumentum nincs megadva, a program egyszerű szövegcserét fog végezni. |
-dotall | A pont karakter a sorvégekre is illeszkedik a reguláris kifejezésekben. |
Az insidetag kivétel lehetséges értékei[szerkesztés]
Az insidetag kivétel lehetséges értékei a textlib.py-ban vannak definiálva. Ezek a következők:
- Első csoport: egyedi tagek
- 'comment': HTML-comment
- 'header': szakaszcímek, akárhány =-lel
- 'pre':
- 'source': a syntaxhighlight taget is kezeli
- 'ref':
- 'startspace': szóközzel kezdődő sorok
- 'table': táblázat (az egymásba ágyazott táblázatokat nem kezeli)
- 'template': sablon (még nem tökéletes a működése)
- 'hyperlink': külső link
- 'gallery':
- 'link': belső hivatkozás, interwiki, kategória, kép
- 'interwiki': normál iw-link + más wikire való belső hivatkozás ([[:en:article]]...)
- Második csoport: HTML-szerű páros tagek
- nowiki, noinclude, includeonly, timeline, math stb.
Globális argumentumok[szerkesztés]
Használható még a -help
, a -lang
, a -family
, a -log
, a -nolog
és a -putthrottle
paraméter.
Mintapéldák[szerkesztés]
Az alábbi utasítással lehet a sablonok régi, {{msg:Csonk}} alakú formátumát az új, {{Csonk}} alakúra változtatni. Előtte a http://download.wikimedia.org oldalról töltsd le a szükséges XML-fájlt (dump).
python replace.py -xml -regex "{{msg:(.*?)}}" "{{\1}}"
A szövegcsere több soros szöveg esetén is elvégezhető:
python replace.py -regex -start:! "Első sor\nMásodik sor" ""
A replace.py segítségével hozzáfűzhetünk vagy beszúrhatunk szövegeket a lapra (a beszúrt szöveget új sorba írjuk):
python replace.py -regex '(?ms)^(.*)$' "\1 > [[Kategória:Új kategória]]"
Amennyiben az XML-fájl a foobar.xml nevet viseli, a kívánt szövegcsere így végezhető el:
python replace.py -xml:foobar.xml "Sajtóhuba" "Sajtóhiba"
Ha a Gipsz Jakab cikkben szeretnéd a HTML-cimkéket a wiki jelölőnyelv elemeire cserélni:
python replace.py -page:Gipsz_Jakab -fix:HTML
A program argumentumok nélküli futtatásával egyszerre több szövegcsere is elvégezhető:
python replace.py -file:blah.txt
A szkript ekkor a felhasználótól külön bekéri a szükséges szövegrészeket. Célszerű az eredményt ellenőrizni, érdemes meggyőződni arról, hogy nem vétettünk hibát a szöveg begépelésénél. Az egyes cikkeket meg lehet adni egy wikilinkeket tartalmazó, külső txt-fájlban is:
[[répa]] [[retek]] [[mogyoró]]
A botot ekkor valami efféle paranccsal indíthatjuk el:
python replace.py <globális argumentumok> -file:cikkek_listája.txt "Sajtóhuba" "Sajtóhiba"
A reguláris kifejezéseket a parancssor helyett a user-fixes.py
fájlhoz is hozzáadhatjuk:
python replace.py -file:cikkek_listája.txt -fix:example2
Példa: több bekezdés cseréje[szerkesztés]
Tegyük fel, hogy a Homokozóban a következő áll:
Itt bátran tesztelhetsz. Üdvözlünk a Homokozóban!
Ha a két mondatot szeretnéd felcserélni (a másodikat az első elé tenni), használd a következő utasítást:
replace.py -page:Wikipédia:Homokozó -regex "Itt bátran tesztelhetsz.\r\n\r\nÜdvözlünk a Homokozóban!" "Üdvözlünk a Homokozóban!\n\nItt bátran tesztelhetsz."
Új sor hozzáadásához használható: \n
Példa: cikkek kigyűjtése[szerkesztés]
A -save kapcsolóval álcseréket is végezhetünk, ami lehetővé teszi valamilyen szöveget tartalmazó vagy nem tartalmazó cikkek kigyűjtését egy állományba. A Wikipédia:Botgazdák üzenőfala/Archív 14#Veszélyeztetett fajok listázása, átalakítás, adatgyűjtés szakaszban foglalt feladat megoldása az alábbi parancsokkal történt (az eredmény a Wikipédia:Állatok műhelye/Redlist laptörténetében látható, amíg ki nem törli valaki):
1. Azon cikkek kigyűjtése az Állatfajok kategóriából és alkategóriáiból, amelyek tartalmazzák az „iucnredlist.org” stringet, de nem tartalmazzák a redlist sablont:
replace.py -catr:"Állatfajok" iucnredlist.org b -excepttext:"{{redlist" -save:redlist.txt
A parancs a keresett iucnredlist.org szöveget cserélné le egy b betűre, de nem végzi el a cserét (szép kis vandalizmus is volna!), csak kigyűjti az érintett cikkeket a redlist.txt-be.
2. Azon cikkek kigyűjtése az Állatfajok kategóriából és alkategóriáiból, amelyek nem tartalmazzák sem az „iucnredlist.org” stringet, sem a redlist sablont:
replace.py -catr:"Állatfajok" e b -excepttext:iucnredlist.org -excepttext:"{{redlist" -save:redlist.txt
Ez esetben mindkét szöveget a kivételek közé írjuk, de akkor mit keressünk? Mondjuk az e-t, a magyar ábécé leggyakoribb magánhangzóját. Nem nagy kockázat kihagyni az e betűt nem tartalmazó cikkeket, ugye? Észrevétel érkezett, hogy a gyűjtésbe olyan cikkek is bekerültek, amelyekben nagybetűs {{Redlist}}
(?) sablon van; ezt vagy egy újabb kivétellel vagy reguláris kifejezések használatával lehetett volna elkerülni.
Példa: rengeteg vastagítás eltüntetése egy szócikkből[szerkesztés]
A Grace klinika epizódjainak listája cikkben több nagy táblázatban rengeteg feleslegesen vastagított epizódcím volt; ezeket célszerű volt bottal eltüntetni. Ilyen esetekben egyetlen cikkhez is érdemes botot használni (de van alternatíva is).
- Mit keresünk?
- ''' párok közé zárt szövegeket,
- amelyek táblázaton belül vannak (a cikk többi részében nem kell cserélni),
- de nem tartalmaznak | jelet (ez biztonsági megerősítés, hogy cellán belül maradjunk – talán nem is lenne muszáj),
- figyelve rá, hogy több is van egy táblázaton belül, tehát rekurzívan keresünk,
- és hogy a táblázatok több sorba vannak tördelve (dotall),
- és hogy minden táblázat nyitókódjához a saját zárókódja és minden nyitó vastagítójelhez a saját párja tartozzék (ezért vannak a mohóságot tiltó kérdőjelek).
- Mire cseréljük?
A vastagítások előtti, közötti és utáni részre; ezeket előre kerek zárójelbe tettük, hogy hivatkozni lehessen rájuk a csoport sorszámával.
- A parancs
(Az olvashatóság kedvéért két sorba tördelve, de természetesen egybe kell írni.)
replace.py -page -regex -recursive -dotall -summary:Vastagtalanítás "(\{\|.*?)'''([^\|]*?)'''(.*?\|\})" "\1\2\3"
A -page után nem írtunk címet, így a bot megkérdezi. Az idézőjel egyrészt illik a parancssori környezetbe, másrészt biztosítja az aposztróf szabad használatát a kifejezésben, mivel az már így nem számít idézőjelnek.
- Az eredmény
Íme. (Gyenge gépen ne kattints!)
Saját függvények használata a javítócsomagokban[szerkesztés]
Egy kis programozással lényegesen kibővíthetjük a replace.py tudását, és csodákat művelhetünk vele. A Pywikipediának ugyanis van egy ritkán használt, nagyszerű képessége: a nemcsak konstans szöveget vagy reguláris kifejezést, hanem függvényt is írhatunk az új szöveg helyére. A keretrendszer ezt felismeri, és ilyenkor végrehajtja a függvényt, és a visszaadott értéket írja a régi szöveg helyébe. Mondani sem kell, hogy ez a reguláris kifejezésekénél összehasonlíthatatlanul nagyobb rugalmasságot tesz lehetővé a szövegcserékben. Azt is megtehetjük, hogy egy függvénnyel állítjuk elő a keresendő és az új szöveget leíró kifejezéseket (például ha sok ismétlődő rész van benne, és nem akarjuk sok helyen átírni a fejlesztésnél, vagy ha szeretnénk áttekinthetőbbé tenni).
Részletesen lásd: Szerkesztő:Bináris/Fixes and functions HOWTO (magyarul is).
Megjegyzések[szerkesztés]
- Ez a szócikk a Pywikipediabot/replace.py című angol Wikimedia-cikk fordításán alapul.
Külső hivatkozások[szerkesztés]
- A Python nyelv dokumentációja – A reguláris kifejezések használatáról (angolul)
- Kodos – Python nyelven írt reguláris kifejezések tesztelésére (angolul)
- Regular-expression.info – bevezetés a reguláris kifejezések tervezésébe, különböző programnyelveken (beleértve a Python nyelvet is) (angolul)